package com.atguigu.yygh.hosp.controller;


import com.atguigu.common.result.Result;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import com.atguigu.yygh.model.hosp.HospitalSet;
import com.atguigu.yygh.vo.hosp.HospitalSetQueryVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 医院设置表 前端控制器
 * </p>
 *
 * @author xueyoupeng
 * @since 2023-06-02
 */
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
@Api(description = "医院设置接口")
@Slf4j
//@CrossOrigin //该controller下的所有接口都支持跨域
public class HospitalSetController {
    @Autowired
    HospitalSetService hospitalSetService;

    @GetMapping("getApiUrl/{hoscode}")
    public String getApiUrl(@PathVariable String hoscode){
        QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("hoscode",hoscode);
        HospitalSet one = hospitalSetService.getOne(queryWrapper);
        return one.getApiUrl();
    }

    /*
     * 查询医院所有设置
     * @author: XueYouPeng
     * @time: 2023/6/4 16:21
     */
    @ApiOperation(value = "查询医院所有设置")
    @GetMapping("findAll")
    public Result findAll(){
        List<HospitalSet> list = hospitalSetService.list();
        return Result.ok().data("list",list).message("查询成功");
    }

    /*
     * 根据医院设置的主键，查询医院设置；
     * 采用路径传参，格式：getHospSet/1
     * 返回值，data中添加item属性存放当前医院设置对象
     * @author: XueYouPeng
     * @time: 2023/6/4 17:56
     */
    @GetMapping("getHospSet/{id}")
    @ApiOperation(value = "根据id查询")
    public Result getHospSet(
            @PathVariable("id") Long id
    ){
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        //需求：data中的item属性，存放该医院设置
        return Result.ok().data("item",hospitalSet).message("查询成功");
    }


    /*
     * 需求：根据id修改医院设置，参数中包括id值
     * @author: XueYouPeng
     * @time: 2023/6/4 18:07
     */
     @PostMapping("updateHospSet")
     @ApiOperation(value = "根据id更新")
     public Result updateHospSet(
             @RequestBody HospitalSet hospitalSet
     ){
         hospitalSetService.updateById(hospitalSet);
         return Result.ok().message("更新成功");
     }


    /*
     * 医院设置列表的条件+分页查询
     * data中的两个属性： rows 当前页结果  ，  total 总记录数
     * @author: XueYouPeng
     * @time: 2023/6/4 16:22
     */
    @PostMapping("{pageNumber}/{pageSize}")
    @ApiOperation(value = "根据条件分页查询")
    public Result pageQuery(
            @PathVariable("pageNumber") Integer pageNumber,
            @PathVariable("pageSize") Integer pageSize,
            //医院列表设置的条件 对应的HospitalSetQueryVo这个实体类
            @RequestBody HospitalSetQueryVo hospitalSetQueryVo
    ){
        //先准备需要的条件

        //1、分页参数,注意：pageNum从1开始，1表示第一页；pageSize每页显示多少条
        Page<HospitalSet> hospitalSetPage = new Page<>(pageNumber,pageSize);

        //2.根据医院编号 和 名字 进行查询
        QueryWrapper<HospitalSet> queryWrapper = new QueryWrapper<>();
        String hosname = hospitalSetQueryVo.getHosname();
        String hoscode = hospitalSetQueryVo.getHoscode();
        //如果名称不为空 就进行模糊查询 hosname  like  ？
        if (!StringUtils.isEmpty(hosname)){
            queryWrapper.like("hosname",hosname);
        }
        //如果编号不为空 则添加到条件中
        if (!StringUtils.isEmpty(hoscode)){
            queryWrapper.eq("hoscode",hoscode);
        }

        //3.调用service中的分页方法
        hospitalSetService.page(hospitalSetPage,queryWrapper);

        //4、从hospitalSetPage中解析返回值，封装Result对象；
        //返回值需求：data中的两个属性： rows 当前页结果,total 总记录数
        List<HospitalSet> list = hospitalSetPage.getRecords();
        long total = hospitalSetPage.getTotal();

        return Result.ok().data("rows",list).data("total",total).message("查询成功");
    }

    /*
     * 根据id删除
     * @author: XueYouPeng
     * @time: 2023/6/4 16:21
     */
    @ApiOperation(value = "根据id删除")
    @DeleteMapping("{id}")
    public Result removeById(@ApiParam(name = "id",value = "医院设置的主键") @PathVariable("id") Long id){
        boolean b = hospitalSetService.removeById(id);
        return b?Result.ok().message("删除成功"):Result.error().message("删除失败");
    }

    /*
     * 批量删除 根据id
     * @author: XueYouPeng
     * @time: 2023/6/4 18:17
     */
     @ApiOperation(value = "根据id批量删除")
     @DeleteMapping("batchRemove")
     public Result batchRemove(
            @RequestBody  List<Long> ids
     ){
         hospitalSetService.removeByIds(ids);
         return Result.ok().message("批量删除成功");
     }


    /*
     * 新增一个医院的接口
     * hospitalSet ， 为某个医院开通医院设置，传递的医院设置相关的数据
     *  开通医院设置的需求：传递的参数包括--hosname+hoscode+apiUrl+signKey+contactsName+contactsPhone
     *  这些参数从业务的角度，是由医院端提供，管理员负责录入
     *  开通的医院设置，默认的status状态需要为1，表示正常状态（权限处于正常状态）。
     *  只有开通了权限的医院，才算入驻到统一挂号平台；才可以上传各种数据
     * @author: XueYouPeng
     * @time: 2023/6/4 17:13
     */
    @PostMapping("saveHospSet")
    @ApiOperation(value = "新增医院")
     public Result saveHospSet(
             //参数 直接使用实体类
             @RequestBody HospitalSet hospitalSet
     ){
         //字段中有status  要为他赋默认值
         hospitalSet.setStatus(1);

         boolean save = hospitalSetService.save(hospitalSet);
         //返回值的属性和返回语言 开发时根据文档而定
         return save ? Result.ok().message("开通成功") : Result.error().message("开通失败");
     }


    /*
     * 医院设置的锁定和解锁
     * 需求： 1、参数有两个，一个医院设置的id，另一个是医院设置的状态（根据id修改status的值）
     *       2、status 的取值范围 0和1，该接口具备判断取值范围的能力，如果不在合理的范围内，给出具体的提示 R.error message="status取值范围不正确"
     *       3、接口需要具备判断是否重复操作的能力，如果当前医院设置的status=0，然后参数status也是0 （之前是0，希望改成0，这就是重复操作）
     *       4、更新时间updateTime也需要同步
     *       5、如果该医院设置不存在，也要给出具体的提示  R.error message="暂未开通医院设置"
     *       6、最后根据id更新status
     * @author: XueYouPeng
     * @time: 2023/6/4 19:55
     */
    @GetMapping("/lockHospitalSet/{id}/{status}")
    @ApiOperation(value = "锁定和解锁")
    public Result lockHospitalSet(
            @PathVariable("id") Long id,
            @PathVariable("status") Integer status
    ){
        //1.判断医院设置是否存在 通过id获得整条数据
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        if (hospitalSet == null){
            return Result.error().message("未开通该医院设置");
        }

        //2、status值取值范围是否正确
        if (status != 0 && status != 1) {
            return Result.error().message("取值范围不正确");
        }

        //3、是否重复操作
        if (hospitalSet.getStatus() == status){
            return Result.error().message("请勿重复操作");
        }

        //4.重新设置status值
        //updateTime在MySQL中为何没有自动更新？因为hospitalSet在之前根据id查询出来的，
        // 其中updateTime有值，在执行更新语句时，将原来的updateTime重新赋值到数据库中，所以没变
        //此处的status 是传进来的参数 也就是要修改的值
        hospitalSet.setStatus(status);
        hospitalSet.setUpdateTime(null);
        hospitalSetService.updateById(hospitalSet);
        return Result.ok().message("修改状态成功");
    }

}






























